home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / sbin / mkboot < prev    next >
Text File  |  2006-04-25  |  10KB  |  400 lines

  1. #!/bin/sh
  2. # mkboot: make the system bootable
  3. # Debian GNU/Linux
  4. # Copyright 1996-1997 Guy Maor <maor@debian.org>
  5. # This is free software; see the GNU General Public License version 2
  6. # or later for copying conditions.  There is NO warranty.
  7.  
  8. set -e
  9.  
  10. PATH=$PATH:/sbin:/usr/sbin
  11.  
  12. # basic devfsd support
  13. if [ -e /dev/.devfsd ]; then
  14.     FLOPPY=/dev/floppy/0
  15. else 
  16.     FLOPPY=/dev/fd0
  17. fi
  18.  
  19. # root partition
  20. if [ $(mount | grep -o "^proc") ] && [ -e /proc/cmdline ]; then
  21.     rootpart=$(grep -o "root=[^ ]*" /proc/cmdline | cut -d \= -f 2)
  22. else
  23.     which rdev >/dev/null && rootpart=$(rdev | cut -d ' ' -f 1)
  24. fi
  25. # temporary directory
  26. tmpdir=${TMPDIR-/tmp}
  27.  
  28. # check whether ELILO is installed
  29. elilocheck() {
  30.     printf "\nChecking for ELILO..."
  31.     if [ -f /etc/elilo.conf ] && [ -x /usr/sbin/elilo ]; then
  32.     echo "Yes"
  33.     return 0
  34.     fi
  35.     echo "No"
  36.     return 1
  37. }
  38.  
  39. # check whether SILO is installed
  40. silocheck() {
  41.     printf "\nChecking for SILO..."
  42.     if [ -f /etc/silo.conf ] && [ -x /sbin/silo ]; then
  43.        echo "Yes"
  44.        return 0
  45.     fi
  46.     echo "No"
  47.     return 1
  48. }
  49.  
  50. # check whether GRUB is installed
  51. grubcheck () {
  52.     if ! which grub >/dev/null; then return 1; fi
  53. }
  54.  
  55. # check whether LILO is installed
  56. lilocheck () {
  57.     printf "\nChecking for LILO..."
  58.     if [ $(whoami) != root ] ; then
  59.     echo "Only root can check for LILO"
  60.         return 1;
  61.     fi
  62.     if [ ! -f /etc/lilo.conf ] || [ ! -x /sbin/lilo ] ; then
  63.     echo "No"
  64.     return 1;
  65.     fi
  66.     bootpart=$(perl -ne 'print $1 if /^\s*boot\s*=\s*(\S*)/' /etc/lilo.conf)
  67.     if [ -z "$bootpart" ] ; then
  68.     # lilo defaults to current root when 'boot=' is not present
  69.     bootpart=$rootpart
  70.     fi
  71.     if [ ${bootpart#/dev/md} != $bootpart ] ||
  72.        [ ${bootpart#/dev/evms/md} != $bootpart ]; then
  73.         echo " - on software RAID device $bootpart - assuming LILO is installed and working."
  74.         return 0;
  75.     fi
  76.     if ! dd if=$bootpart ibs=16 count=1 2>&- | grep -q LILO ; then
  77.     printf "\nYes, but I couldn't find a LILO signature on $bootpart\n"
  78.     echo "Check your /etc/lilo.conf, or run /sbin/lilo by hand."
  79.     return 1;
  80.     fi
  81.     echo "Yes, on $bootpart"
  82.     return 0;
  83. }
  84.  
  85. # check whether PALO is installed
  86. palocheck() {
  87.     printf "\nChecking for PALO..."
  88.     if [ -f /etc/palo.conf ] && [ -x /sbin/palo ]; then
  89.        echo "Yes"
  90.        return 0
  91.     fi
  92.     echo "No"
  93.     return 1
  94. }
  95.  
  96. # make a lilo boot disk
  97. makelilo () {
  98. (
  99.     b=$tmpdir/boot$$
  100.     trap "set +e; cd /; umount $FLOPPY; rmdir $b" EXIT
  101.     mkdir $b
  102.     mke2fs -q $FLOPPY 
  103.     mount -t ext2 $FLOPPY $b
  104.     if [ -e /boot/boot.b ]; then
  105.         cp /boot/boot.b $b/boot.b
  106.     fi
  107.     cp $1 $b/vmlinuz
  108.     # if a symbolic link, look for the real file
  109.     kfile=`readlink -f $1`
  110.     # see if we need an "initrd=" line in lilo.conf
  111.     kdir=`dirname $kfile`
  112.     if [ $kdir = . ]; then kdir=$PWD   # full path
  113.       elif [ $kdir = boot ]; then kdir=/boot; kfile="/$kfile"; fi
  114.     # make sure directory exists
  115.     if [ -d $kdir ]; then
  116.         # extract version
  117.         case $kfile in
  118.             *-*) kvers=${kfile#*-} ;;
  119.             *)   kvers="" ;;
  120.         esac
  121.         # look for matching initrd.img
  122.     if [ "$kvers" = "" ]; then ifile="$kdir"/initrd.img
  123.     else ifile="$kdir"/initrd.img-$kvers ; fi
  124.     #
  125.     if [ ! -f $ifile ]; then ifile=""; fi
  126.     else
  127.         kdir="" ; ifile=""
  128.     fi
  129.     # kfile is now the full path to the kernel image, and
  130.     # ifile is now the initrd.img that matches the kernel, or null
  131.     #
  132.     echo "Kernel is at $kfile in $kdir"
  133.     if [ "$ifile" != "" ]; then echo "Matching initrd image is $ifile";fi
  134.     #
  135.     lilo_conf="# floppy lilo.conf
  136.     boot = $FLOPPY
  137.     install = boot.b
  138.     map = map"
  139.     state=G
  140.     usesinitrd=n
  141.     # examine /etc/lilo.conf
  142.     while read line
  143.     do
  144.         case $line in
  145.         "#"* | "" ) continue ;;   # skip comments and blank lines
  146.         *boot*=* | *root*=* | *install*=* ) continue ;;
  147.         *map*=* | *message*=* ) continue    # skip these files as well
  148.                     ;;
  149.         *image*=* ) if [ $state = L ]; then
  150.                 break
  151.             fi   # done
  152.             #
  153.                     case $line in
  154.                 *$1 )  kimg=`echo ${line#*=}`
  155.                           state=L   # found correct kernel
  156.                           ;;
  157.                 *linu*) kimg=`echo ${line#*=}`
  158.                     # see if this is the right Linux kernel
  159.                     if [ `ls -l $kimg |
  160.                          awk '{print $NF}'` = $kfile ]; then
  161.                             state=L   # found right kernel
  162.                     else
  163.                         state=I   # Ignore wrong kernel
  164.                     fi
  165.                            ;;
  166.                 * ) state=I   # Ignore this stanza
  167.                        ;;
  168.                     esac
  169.             #
  170.             if [ $state = L ]; then
  171.                          lilo_conf="$lilo_conf
  172.                            # kernel-specific:
  173.                        $line"
  174.             fi
  175.             ;;
  176.         *other*=* ) state=I  # ignore non-Linux stanza
  177.                     ;;
  178.         * ) if [ $state != I ]; then
  179.                lilo_conf=`printf "$lilo_conf\n$line\n"`
  180.         fi
  181.         #
  182.         case $line in
  183.             *initrd*=* )  lcinitrd=`ls -l ${line#*=} |
  184.                                     awk '{print $NF}'`
  185.                           if [ $lcinitrd = "$ifile" ]; then
  186.                       usesinitrd=y
  187.                   fi
  188.                           ;;
  189.         esac
  190.         ;;
  191.     esac
  192.     done < /etc/lilo.conf
  193.     #
  194.     lilo_conf=`printf "$lilo_conf\nroot = $rootpart\n"`
  195.     #
  196.     if [ $state = L ]; then
  197.         echo "Found kernel image $kimg in existing /etc/lilo.conf"
  198.     if [ "$liloOK" != n ] && [ $usesinitrd = y ] && [ "$ifile" != "" ]; then
  199.         echo "   and the correct initrd.img as well."
  200.         problems=n
  201.     elif [ "$liloOK" != n ] && [ $usesinitrd = n ] && [ "$ifile" = "" ]; then
  202.         problems=n   # no initrd needed
  203.     elif [ "$liloOK" != n ] && [ $usesinitrd = n ] && [ "$ifile" != "" ]; then
  204.         echo "   but it does not invoke $ifile ."
  205.         problems=y
  206.     elif [ "$liloOK" = n ] && [ $usesinitrd = y ]; then
  207.         echo "   and the correct initrd.img as well,"
  208.         echo "   but there were problems in installing from it."
  209.         problems=y
  210.     else
  211.         echo "but it does not mention the required initrd.img ."
  212.         problems=y
  213.     fi
  214.     else
  215.     echo "Could not find the requested kernel in your"
  216.     echo "   current /etc/lilo.conf ."
  217.     problems=y
  218.     fi
  219.     #
  220.     if [ $problems = n ]; then
  221.         echo "Your current /etc/lilo.conf looks good, and can be used"
  222.         echo "   as the basis for the boot-floppy lilo.conf."
  223.     else
  224.         echo "The mkboot script can probably do better."
  225.     fi
  226.     sleep 8
  227.     #
  228.     echo
  229.     echo "Here is the proposed lilo.conf:"
  230.     echo
  231.     echo "$lilo_conf"
  232.     echo
  233.     echo "You can install the boot-loader from this best guess,"
  234.     echo "or you can try to install from a \`vanilla\' lilo.conf ."
  235.     echo
  236.     reply=""
  237.     while [ "$reply" = "" ]
  238.     do
  239.         printf "Which do you choose? (Enter B for best, V for vanilla): "
  240.         read reply
  241.     done
  242.     #
  243.     if [ $reply = B ] || [ $reply = b ]; then
  244.     echo "Installing the best-guess lilo.conf..."
  245.         cd $b
  246.         echo "$lilo_conf" > lilo.conf
  247.     else
  248.     echo "Installing the vanilla lilo.conf..."
  249.         cd $b
  250.         cat > lilo.conf <<- EOF
  251.         lba32
  252.         boot = $FLOPPY
  253.         install = boot.b
  254.         map = map
  255.         compact
  256.         prompt
  257.         timeout = 50
  258.         read-only
  259.         image = vmlinuz
  260.         label = linux
  261.         root = $rootpart
  262.     EOF
  263.     fi
  264.     #
  265.     lilo -C lilo.conf
  266.     cat <<EOF
  267. If you need to modify the floppy's lilo.conf, run the following:
  268.  
  269.         mount $FLOPPY /mnt
  270.         cd /mnt
  271.         vi lilo.conf        # edit the file
  272.         lilo -C lilo.conf    # run lilo on floppy
  273.         cd
  274.         umount $FLOPPY
  275. EOF
  276. )
  277. }
  278.  
  279.  
  280. # make a simple boot disk
  281. makesimple () {
  282. (
  283.     dd if=$1 of=$FLOPPY
  284.     rdev $FLOPPY $rootpart
  285.     rdev -R $FLOPPY 1
  286. )
  287. }    
  288.  
  289.  
  290.  
  291. # make a boot disk
  292. makedisk () {
  293.     kernel=${1:-/vmlinuz}
  294.     if [ ! -r $kernel ] ; then
  295.     echo "Error: Can't read $kernel."
  296.     exit 1
  297.     fi
  298.  
  299.     boottype="lilo"
  300.     if [ $(whoami) != root ] ; then
  301.     echo "Since you don't have root permissions, I can't put LILO on the diskette."
  302.     echo "I will make a non-LILO diskette instead, but it won't be as useful.  You"
  303.     echo "can hit <Ctrl-C> to cancel."
  304.     boottype="simple"
  305.     fi
  306.  
  307.     printf "\nInsert a floppy diskette into your boot drive, and press <Return>. "
  308.     read input
  309.     diskok=0
  310.     while [ "$diskok" != 1 ] ; do
  311.     printf "\nCreating a $boottype bootdisk...\n"
  312.     make$boottype $kernel
  313.     if [ $? -eq 0 ] ; then
  314.         diskok=1
  315.     else
  316.         printf "\nThere was a problem creating the boot diskette.  Please make sure that\n"
  317.         echo "you inserted the diskette into the correct drive and that the diskette"
  318.         echo "is not write-protected."
  319.         printf "\nWould you like to try again? (y/n) "
  320.         read input
  321.         if [ "$input" != "y" ] ; then
  322.         return 1
  323.         fi
  324.     fi
  325.     done
  326.     echo "...Success."
  327.     return 0
  328. }
  329.  
  330. usage="$0 [-r rootpartition] [-i] [-d device] [kernel]"
  331.  
  332. while getopts "r:id:h-" opt ; do
  333.     case "$opt" in
  334.     r) rootpart="$OPTARG" ;;
  335.     i) installkernel=1 ;;
  336.     d) FLOPPY="$OPTARG" ;;
  337.     h) echo $usage ; exit 0 ;;
  338.     -) break ;;
  339.     *) echo $usage 1>&2 ; exit 1 ;;
  340.     esac
  341. done
  342. shift $(($OPTIND - 1))
  343.  
  344. if [ "$installkernel" ] ; then
  345.     echo "In order to use the new kernel image you have just installed, you"
  346.     echo "will need to reboot the machine.  First, however, you will need to"
  347.     echo "either make a bootable floppy diskette, re-run LILO, or have GRUB"
  348.     echo "installed."
  349.  
  350.     if elilocheck; then
  351.     printf "\nShould I run /usr/sbin/elilo? (y/N) "
  352.     read input
  353.     if [ "$input" = "y" ] ; then
  354.         /usr/sbin/elilo && exit 0
  355.             echo "There was a problem running /usr/sbin/elilo."
  356.     fi
  357.     fi
  358.  
  359.     if grubcheck; then
  360.         printf "\nGRUB is installed. To automatically switch to new kernels, point your\n"
  361.         echo "default entry in menu.lst to $1"
  362.         exit 0
  363.     fi
  364.  
  365.     if lilocheck; then
  366.         liloOK=y
  367.     printf "\nShould I run /sbin/lilo? (y/N) "
  368.     read input
  369.     if [ "$input" = "y" ] ; then
  370.         /sbin/lilo && exit 0
  371.             echo "There was a problem running /sbin/lilo."
  372.             liloOK=n
  373.     fi
  374.     fi
  375.  
  376.     if silocheck; then
  377.         printf "\nSILO is installed. To automatically switch to new kernels, point your\n"
  378.         echo "default entry in silo.conf to $1"
  379.         exit 0
  380.     fi
  381.  
  382.     if palocheck; then
  383.         printf "\nPALO is installed. To automatically switch to new kernels, point your\n"
  384.         echo "default entry in palo.conf to $1"
  385.         exit 0
  386.     fi
  387.  
  388.     printf "\nShould I make a bootdisk? (y/N) "
  389.     read input
  390.     if [ "$input" = "y" ] ; then
  391.     makedisk $1 && exit 0
  392.     fi
  393.  
  394.     printf "\nWARNING: Your system is probably unbootable now.  After correcting any\n"
  395.     echo "problems, rerun this script with the command \`mkboot -installkernel'."
  396.     exit 1
  397. fi
  398.  
  399. makedisk $1
  400.